/**
 * 给定数组A，从中选M个数，使得
 * 1. 任意元素不同
 * 2. 任意元素差绝对值不差过M
 * 这些条件组合在一起，实质上表示必须取连续的数
 * 记录A中每个元素的数量，并且将A排序去重
 * 对A中连续的每一段，如果长度超过M，则对答案有贡献
 * 每M个数的贡献就是数量的连乘积
 * 扫描一遍即可
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;

llt const MOD = 1000000000 + 7;

llt qpow(llt a, llt n){
    llt ret = 1;
    while(n){
        if(n & 1) ret = ret * a % MOD;
        a = a * a % MOD;
        n >>= 1;
    }
    return ret;
}

llt inv(llt a){return qpow(a, MOD-2LL);}

int N, M;
vi A;

llt proc(){
    map<int, int> cnt;
    for(auto i : A) ++cnt[i];
    sort(A.begin(), A.end());
    A.erase(unique(A.begin(), A.end()), A.end());

    int n = A.size();
    int k = 0;
    llt ans = 0;
    while(1){
        int c = 0;
        while(k + c < n and A[k+c] - A[k] == c) ++c;
        
        if(c >= M){
            llt tmp = 1;
            for(int i=k;i<k+M;++i){
                tmp = (tmp * cnt[A[i]]) % MOD; 
            }
            ans = (ans + tmp) % MOD;
            for(int i=k+M;i<k+c;++i){
                tmp = (tmp * cnt[A[i]]) % MOD * inv(cnt[A[i-M]]) % MOD;
                ans = (ans + tmp) % MOD;
                // cout << ans << endl;
            }
        }
                
        if((k += c) == n) break;
    }
    return ans;
}


int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    cin >> nofkase;
    while(nofkase--){
        cin >> N >> M;
        A.assign(N, 0);
        for(auto & i : A) cin >> i;
        cout << proc() << endl;
    }
    return 0;
}